grammar Flexer;

options {
  language = Java;

}

@lexer::header{
package flex;
}

@header{
package flex;
}

fragment NEWLINE: '\r'?'\n'; // Cambio de linea
fragment DIGITO: '0'..'9';
LETRA: 'A'..'Z'|'a'..'z';

NUMERO: DIGITO+;

//CADENA  : '"' options {greedy=false;} : . )* '"';
BLANCO: (' '|'\t'|NEWLINE) {$channel=HIDDEN;};  // Caracteres ignorados
COMENTARIO :'/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;};

INT: 'int';
CHAR: 'char';
PRINT: 'printf';
RETURN: 'return';
//INCLUDE: 'include';
VOID: 'void';
MAIN: 'main';
//STRING: 'String';
TEXTO : LETRA+;


ADD: '+';
GUION :'-';
ASTER: '*';
EQUAL: '='; 
PAROP: '(';
PARCL: ')';
COMA: ',';
SEMI: ';';
BARRAINV:'\\';
//COLON: ':';
//DOT: '.';
LLAVOP: '{';
LLAVCL: '}';
COROP: '[';
CORCL: ']';
PERCENT: '%'; 
//AND: '&';
OR: '|';
//MENOR: '<'; 
//MAYOR: '>';
//BARRA: '/';
//SIMPLES: '\'';
DOBLES: '"';
//HASH: '#';
OPEN_BLOQ: PERCENT LLAVOP;
CLOSE_BLOQ: PERCENT LLAVCL;

SEPARA: '%%';

RANGO: ((DIGITO GUION DIGITO) | (LETRA GUION LETRA))+ ;
DEFINICION: INT TEXTO SEMI;

//FUNCION: INT TEXTO PAROP VOID PARCL LLAVOP DEVOL LLAVCL;
//LLAMADA: IDENT PAROP (IDENT)? PARCL SEMI;
//DEVOL: RETURN DIGITO SEMI;
//
//PRINTF: PRINT LLAVOP DOBLES IDENT EQUAL PERCENT IDENT BARRA IDENT DOBLES COMA IDENT PARCL SEMI;
//

entrada: apartadoA SEPARA apartadoB SEPARA apartadoC EOF;// apartadoB SECCION apartadoC EOF; 

apartadoA: dato dato  bloque;
dato: TEXTO COROP RANGO CORCL;
bloque: OPEN_BLOQ definicion definicion CLOSE_BLOQ;
definicion: INT TEXTO SEMI;

apartadoB: linea1 linea2;
linea1  : LLAVOP TEXTO LLAVCL PAROP LLAVOP TEXTO LLAVCL OR LLAVOP TEXTO LLAVCL PARCL ASTER TEXTO ADD ADD SEMI;
linea2  : LLAVOP TEXTO LLAVCL ADD TEXTO ADD ADD SEMI; 

apartadoC: apdoCA apdoCB apdoCC apdoCD apdoCE;
apdoCA  : INT TEXTO PAROP VOID PARCL LLAVOP RETURN NUMERO SEMI LLAVCL;
apdoCB  : INT MAIN PAROP INT TEXTO COMA CHAR ASTER TEXTO COROP CORCL PARCL LLAVOP;
apdoCC  : TEXTO EQUAL TEXTO PAROP TEXTO COROP NUMERO CORCL COMA DOBLES LETRA DOBLES PARCL SEMI;
apdoCD  : asigna asigna resto;
asigna  : TEXTO EQUAL NUMERO SEMI;
resto : TEXTO PAROP PARCL SEMI TEXTO PAROP TEXTO PARCL SEMI;
apdoCE  : imprime imprime RETURN NUMERO SEMI LLAVCL;
imprime : PRINT PAROP DOBLES TEXTO TEXTO TEXTO EQUAL PERCENT LETRA BARRAINV LETRA DOBLES COMA TEXTO PARCL SEMI;

